//大部分JavaScript函数都可以当作构造器使用。构造器的外表跟普通函数一模一样，它们的区别在于被调用的方式。当用new运算符调用函数时，该函数总会返回一个对象，通常情况下，构造器里的this就指向返回的这个对象，

//构造器里的this 就指向返回的这个对象，见如下代码：
var MyClass = function(){
    this.name = 'sven';
};

var obj = new MyClass();
console.log ( obj.name ); // 输出：sven


//但用new调用构造器时，还要注意一个问题，如果构造器显式地返回了一个object类型的对象，那么此次运算结果最终会返回这个对象，而不是我们之前期待的this：

var MyClass = function(){
    this.name = 'sven';
    return { // 显式地返回一个对象
        name: 'anne'
    }
};

var obj = new MyClass();
console.log ( obj.name ); // 输出：anne

//如果构造器不显式地返回任何数据，或者是返回一个非对象类型的数据，就不会造成上述问题：”

var MyClass = function(){
    this.name = 'sven'
    return 'anne'; // 返回string 类型
};

var obj = new MyClass();
console.log ( obj.name ); // 输出：sven

//跟普通的函数调用相比，用Function.prototype.call或Function.prototype.apply可以动态地改变传入函数的this：

var obj1 = {
    name: 'sven',
    getName: function(){
        return this.name;
    }
};

var obj2 = {
    name: 'anne'
};

console.log( obj1.getName() ); // 输出: sven
console.log( obj1.getName.call( obj2 ) ); // 输出：anne